package com.sina.finance.api.framework.dao;

import java.util.List;
import java.util.Map;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

public abstract class BasicDao extends JdbcDaoSupport {

	/** 查询 */
	public <T> List<T> query(String sql, RowMapper<T> rowMapper){
		return this.getJdbcTemplate().query(sql, rowMapper);
	}
	
	public <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper){
		return this.getJdbcTemplate().query(sql, args, rowMapper);
	}
	
	public <T> List<T> query(String sql, RowMapper<T> rowMapper, Object...args){
		return this.getJdbcTemplate().query(sql, rowMapper, args);
	}
	
	public <T> List<T> query(String sql, Object[] args, int[] argTypes, RowMapper<T> rowMapper){
		return this.getJdbcTemplate().query(sql, args, argTypes, rowMapper);
	}
	
	public int queryForInt(String sql){
		return this.getJdbcTemplate().queryForInt(sql);
	}
	
	public int queryForInt(String sql, Object...args){
		return this.getJdbcTemplate().queryForInt(sql, args);
	}
	
	public int queryForInt(String sql, Object[] args, int[] argTypes){
		return this.getJdbcTemplate().queryForInt(sql, args, argTypes);
	}

	public List<Map<String, Object>> queryForList(String sql){
		return this.getJdbcTemplate().queryForList(sql);
	}
	
	public List<Map<String, Object>> queryForList(String sql, Object...args){
		return this.getJdbcTemplate().queryForList(sql, args);
	}
	
	public List<Map<String, Object>> queryForList(String sql, Object[] args, int[] argTypes){
		return this.getJdbcTemplate().queryForList(sql, args, argTypes);
	}
	
	
	public <T> Object queryForObject(String sql, Object[] args, Class<T> requiredType){

		Object queryResult = null;

		try{
			queryResult = this.getJdbcTemplate().queryForObject(sql, args, requiredType);
		} catch (EmptyResultDataAccessException e){
			queryResult = null;
		}

		return queryResult;
	}
	
	public <T> Object queryForObject(String sql, Object[] args, RowMapper<T> rowMapper){
		Object resultObject = null;
		List<T> resultList = this.query(sql, args, rowMapper);
		if(resultList != null && resultList.size() > 0){
			resultObject = resultList.get(0);
		}
		return resultObject;
	}

	/** 写入 */
	public int insert(String sql){
		return this.getJdbcTemplate().update(sql);
	}
	
	public int insert(String sql, Object...args){
		return this.getJdbcTemplate().update(sql, args);
	}
	
	public int insert(String sql, Object[] args, int[] argTypes){
		return this.getJdbcTemplate().update(sql, args, argTypes);
	}
	
	/** 更新 */
	public int update(String sql){
		return this.getJdbcTemplate().update(sql);
	}
	
	public int update(String sql, Object...args){
		return this.getJdbcTemplate().update(sql, args);
	}
	
	public int update(String sql, Object[] args, int[] argTypes){
		return this.getJdbcTemplate().update(sql, args, argTypes);
	}
	
	/** 删除 */
	public int delete(String sql){
		return this.getJdbcTemplate().update(sql);
	}
	
	public int delete(String sql, Object...args){
		return this.getJdbcTemplate().update(sql, args);
	}
	
	public int delete(String sql, Object[] args, int[] argTypes){
		return this.getJdbcTemplate().update(sql, args, argTypes);
	}
	
	/** 批量更新 */
	public int[] batchUpdate(String[] sqls){
		return this.getJdbcTemplate().batchUpdate(sqls);
	}
	
	public int[] batchUpdate(String sql, List<Object[]> batchArgs){
		return this.getJdbcTemplate().batchUpdate(sql, batchArgs);
	}
	
	public int[] batchUpdate(String sql, List<Object[]> batchArgs, int[] argTypes){
		return this.getJdbcTemplate().batchUpdate(sql, batchArgs, argTypes);
	}

}
